Los principales objetivos de este ejercicio fueron el definir y completar 7 entradas para la GDT (tarea\_inicial, IDLE y las
5 tareas), definir y completar las entradas del arreglo TSS (para la tarea\_inicial, IDLE y las 5 tareas) y escribir el
c\'odigo necesario para ejecutar la tarea IDLE.

\subsubsection{Definir y completar GDT de las 7 Tareas}
El archivo {\bf gdt.c} contiene el c\'odigo para definir y completar las entradas de la GDT para las 7 tareas.
\\
En {\bf gdt.c} se defini\'o la funci\'on \texttt{setear\_descriptor\_tss\_GDT} la cual completa el descriptor de segmento de
las tareas y es llamada desde las funciones \texttt{cargarIdle}, \texttt{cargarInicial} y \texttt{cargar\_tareas} que se
encuentran en el archivo {\bf tss.c}.
Para las primeras 2 funciones \texttt{cargar} el par\'ametro de entrada es el puntero a la tarea a cargar y para
\texttt{cargar\_tareas} recibe un puntero al arreglo de las 5 tareas.
\\
\hspace*{10pt}
La funci\'on \texttt{cargarInicial} carga la tarea\_inicial en el \'indice 1 de la GDT poni\'endo nivel 0 en el DPL.
La funci\'on \texttt{cargarIdle} carga la tareaIdle en el \'indice 2 de la GDT poni\'endo nivel 0 en el DPL. Adem\'as de esto,
hace el mapeo de la direcci\'on virtual TASK\_CODE con la direcci\'on f\'isica TASK\_IDLE seteando los atributos de presente y
read/write (0x3), utilizando el CR3 de la tarea Idle. Tambi\'en hace el mapeo de la direcci\'on virtual TASK\_CODE con la
direcci\'on f\'isica STTI, setenado los mismos atributos que el mapeo anterior.
\\
\hspace*{10pt}
La funci\'on \texttt{cargar\_tareas} va recorriendo el arreglo $tsss$ para cargar las 5 tareas. Para cada una de las tareas
utiliza la funci\'on \texttt{inicializar\_dir\_tarea} para hacer el identity mapping de los primeros 2MB (con nivel de supervisor)
e inicializar el Page Directory y mapear las p\'aginas virtuales de TASK\_CODE, TASK\_STACK y TASK\_SHARE con las direcciones
f\'isicas que se encuentran en los arreglos de {\bf rand.c}. La funci\'on \texttt{inicializar\_dir\_tarea} tambi\'en realiza la
acci\'on de copiar el c\'odigo de la tarea a su \'area de arena asignada, para la direcci\'on f\'isica del c\'odigo de la tarea
(TASK) vamos recorriendo toda la p\'agina y copiando byte a byte a la arena asignada a la tarea por el arreglo $pc$. Adem\'as
para las 5 tareas define los descriptores de segmento TSS en la GDT a partir del \'indice 3 hasta el 7 inclusive.
\\
\\
\hspace*{10pt}
Los descriptores de segmento TSS para las 7 tareas quedan de la siguiente manera:

\begin{table}[H]
	\centering
	\scalebox{0.8}{
	\begin{tabular}{|c|c|c|c|}
		\hline
		Campo & Valor TSS Tareas & Valor TSS Idle e Inicial & Comentario \\ \hline
		limit\_0\_15 & \multicolumn{2}{|c|}{\texttt{(unsigned short)0x67}} &
		\texttt{0x67 = 103} que es el tama\~no (104-1) del Task Segment \\ \hline
		base\_0\_15 & \multicolumn{2}{|c|}{\texttt{(unsigned short)((unsigned int)\_tss)}} &
		Tomamos los primeros 16 bits de la base \\ \hline
		base\_23\_16 & \multicolumn{2}{|c|}{\texttt{(unsigned char)(((unsigned int)\_tss) $>>$ 16)}} &
		Tomamos los ultimos 8 bits de la base \\ \hline
		type & \multicolumn{2}{|c|}{\texttt{0x9}} &
		\texttt{0x10B1}, donde B es el de Busy, ponemos 0 \\
		& \multicolumn{2}{|c|}{} & \multicolumn{1}{|c|}{marcando como inactiva a la tarea $\Rightarrow$ \texttt{1001 = 0x9}} \\ \hline
		s & \multicolumn{2}{|c|}{0} & \\ \hline
		dpl & \texttt{0x3} & \texttt{0x0} &
		Nivel 3 para las tareas y Nivel 0 para la tarea idle e inicial \\ \hline
		p & \multicolumn{2}{|c|}{1} &
		Presente \\ \hline
		limit\_16\_19 & \multicolumn{2}{|c|}{\texttt{0x0}} & \\ \hline
		avl & \multicolumn{2}{|c|}{0} & \\ \hline
		l & \multicolumn{2}{|c|}{0} & \\ \hline
		db & \multicolumn{2}{|c|}{1} & \\ \hline
		g & \multicolumn{2}{|c|}{0} & \\ \hline
		base\_31\_24 & \multicolumn{2}{|c|}{\texttt{(unsigned char)((unsigned int)\_tss $>>$ 24)}} & \\ \hline
	\end{tabular}
}
\caption{Entrada GDT para la TSS.}
\end{table}

\subsubsection{Completar arreglo de TSS}
Las funciones \texttt{cargarIdle} y \texttt{cargar\_tareas} tambi\'en completan las entradas del arreglo de TSS de la siguiente
manera:

\begin{table}[H]
	\centering
	\scalebox{0.8}{
	\begin{tabular}{|c|c|c|c|}
		\hline
		Campo & Valor TSS Tareas & Valor TSS Idle & Comentario \\ \hline
		\_ptl & \multicolumn{2}{|c|}{0} & \\ \hline
		unused0 & \multicolumn{2}{|c|}{0} & \\ \hline
		esp0 & \multicolumn{2}{|c|}{\_pila0} & Pila de nivel 0 (STT correspondiente+0x1000) \\ \hline
		ss0 & \multicolumn{2}{|c|}{\texttt{0x60}} & Selector de datos de nivel 0 \\ \hline
		unused1 & \multicolumn{2}{|c|}{0} & \\ \hline
		esp1 & \multicolumn{2}{|c|}{0} & \\ \hline
		ss1 & \multicolumn{2}{|c|}{0} & \\ \hline
		unused2 & \multicolumn{2}{|c|}{0} & \\ \hline
		esp2 & \multicolumn{2}{|c|}{0} & \\ \hline
		ss2 & \multicolumn{2}{|c|}{0} & \\ \hline
		unused3 & \multicolumn{2}{|c|}{0} & \\ \hline
		cr3 & \multicolumn{2}{|c|}{\_cr3} & CR3 de cada tarea / idle \\ \hline
		eip & \multicolumn{2}{|c|}{\_eip} & EIP de cada tarea / idle \\ \hline
		eflags & \multicolumn{2}{|c|}{\texttt{0x00000202}} & EFLAGS Habilitadas la interrupciones \\ \hline
		eax & \multicolumn{2}{|c|}{0} & \\ \hline
		ecx & \multicolumn{2}{|c|}{0} & \\ \hline
		edx & \multicolumn{2}{|c|}{0} & \\ \hline
		ebx & \multicolumn{2}{|c|}{0} & \\ \hline
		esp & \multicolumn{2}{|c|}{\_pila} & \_pila = TASK\_CODE+0x1000 por crece al reves \\ \hline
		ebp & \multicolumn{2}{|c|}{\_pila} & \_pila = TASK\_CODE+0x1000 por crece al reves \\ \hline
		esi & \multicolumn{2}{|c|}{0} & \\ \hline
		edi & \multicolumn{2}{|c|}{0} & \\ \hline
		es & \texttt{0x6B} & \texttt{0x60} & Segmento de datos de nivel 3/0 \\ \hline
		unused4 & \multicolumn{2}{|c|}{0} & \\ \hline
		cs & \texttt{0x5B} & \texttt{0x50} & Segmento de c\'odigo de nivel 3/0 \\ \hline
		unused5 & \multicolumn{2}{|c|}{0} & \\ \hline
		ss & \texttt{0x6B} & \texttt{0x60} & Segmento de datos de nivel 3/0 \\ \hline
		unused6 & \multicolumn{2}{|c|}{0} & \\ \hline
		ds & \texttt{0x6B} & \texttt{0x60} & Segmento de datos de nivel 3/0 \\ \hline
		unused7 & \multicolumn{2}{|c|}{0} & \\ \hline
		fs & \texttt{0x6B} & \texttt{0x60} & Segmento de datos de nivel 3/0 \\ \hline
		unused8 & \multicolumn{2}{|c|}{0} & \\ \hline
		gs & \texttt{0x6B} & \texttt{0x60} & Segmento de datos de nivel 3/0 \\ \hline
		unused9 & \multicolumn{2}{|c|}{0} & \\ \hline
		ldt & \multicolumn{2}{|c|}{0} & \\ \hline
		unused10 & \multicolumn{2}{|c|}{0} & \\ \hline
		dtrap & \multicolumn{2}{|c|}{0} & \\ \hline
		iomap & \multicolumn{2}{|c|}{\texttt{0xFFFF}} & Mapa propuesto por la catedra \\
		\hline
	\end{tabular}
}
\caption{TSS.}
\end{table}

\subsubsection{Ejecutar tarea IDLE}
Una vez definidos todos los descriptores de segmentos TSS en la GDT y completo el arreglo de TSS para las tareas desde el Kernel
procedemos a saltar de la tarea\_inicial (la tarea actual) a la tarea IDLE. El \'indice de la tarea\_inicial es 1, lo
multiplicamos por 8 para obtener el selector y lo cargamos en el task register usando la instrucci\'on ltr. Ahora s\'i podemos
hacer el salto, el \'indice en la GDT de la tarea IDLE es 2 (mov eax, 2). Lo multiplicamos por 8 para obtener su selector (shl
eax, 3). Hacemos un jump a la tarea IDLE de la siguiente manera: mov [TSSIDLE\_selector], ax $\rightarrow$ jmp far
[TSSIDLE\_offset] (donde esta definido TSSIDLE\_selector: dw 0).



 
